ZJU 1346 (状压dp) Posted on 2018-07-30 | In ACM , ZJU 状压dp裸题 题解 显然的状压dp dp[i]:二进制数位i的状态的数量 记录每个点的依赖关系即可 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=(1<<20)+100;char str1[20],str2[20];char name[20][20];int n,m,cnt[20], len;ll dp[maxn];void init(){ memset(cnt,0,sizeof(cnt)); n=0;}int main(){ while(scanf("%d",&m)!=EOF) { init(); int u,v; for(int i=0;i<m;i++) { scanf("%s%s",str1,str2); for(u=0;u<n;u++) if(strcmp(name[u],str1)==0) break; if(u==n) strcpy(name[n++],str1); for(v=0;v<n;v++) if(strcmp(name[v],str2)==0) break; if(v==n) strcpy(name[n++],str2); cnt[v]|=(1<<u); } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<(1<<n);i++) { if(dp[i]!=0) { for(int j=0;j<n;j++) { if(!(i&(1<<j))) { if((i&cnt[j])==cnt[j]) { dp[i|(1<<j)]+=dp[i]; } } } } } printf("%lld\n",dp[(1<<n)-1]); } return 0;}